import { BblPrizeGroup } from "../entity/prize.group.entity";

/**
 * 活动状态映射对象
 * 键为数据库存储的状态值，值为前端显示的文本
 */
export const PRIZE_GROUP_STATUS_MAP = {
  0: "未开始",
  1: "进行中",
  2: "已结束",
  3: "已取消"
};

/**
 * 根据活动状态值获取对应的显示文本
 * @param status 活动状态数据库存储值（0=未开始,1=进行中,2=已结束,3=已取消）
 * @returns 翻译后的状态文本，未知状态返回格式化字符串
 */
export function getPrizeGroupStatusText(status: number): string {
  return PRIZE_GROUP_STATUS_MAP[status] || `未知状态(${status})`;
}

/**
 * 抽奖活动创建传输对象
 * 用于前端向服务端传递创建活动的必要信息
 */
export class PrizeGroupCreateDto {
  /** 活动名称，前端输入的活动显示名称，必填字段 */
  name: string;

  /** 活动描述，对活动的详细说明，支持富文本或纯文本 */
  description?: string;

  /** 活动状态，默认为0（未开始） */
  status?: number;

  /** 开始时间，活动开始的时间点，前端传递13位时间戳 */
  startTime?: number;

  /** 结束时间，活动结束的时间点，前端传递13位时间戳 */
  endTime?: number;
}

/**
 * 抽奖活动列表查询传输对象
 * 用于前端向服务端传递活动列表的筛选条件
 */
export class PrizeGroupListQueryDto {
  /** 活动名称（模糊查询），可选字段，支持部分字符串匹配 */
  name?: string;

  /** 活动状态（精确查询），可选字段，与数据库存储的状态值一致 */
  status?: number;
}

/**
 * 抽奖活动分页查询传输对象
 * 继承列表查询条件并添加分页参数
 */
export class PrizeGroupPageQueryDto extends PrizeGroupListQueryDto {
  /** 每页显示数量，字符串类型（前端传递时通常为字符串） */
  pageSize: string;

  /** 当前页码，字符串类型（前端传递时通常为字符串） */
  current: string;
}

/**
 * 抽奖活动列表传输对象
 * 用于服务端向前端返回活动列表的简化数据结构
 */
export class PrizeGroupListDto {
  constructor(prizeGroup: BblPrizeGroup) {
    this.id = prizeGroup.id;
    this.name = prizeGroup.name;
    this.status = prizeGroup.status;
    this.statusText = getPrizeGroupStatusText(prizeGroup.status);
    this.startTime = prizeGroup.startTime
      ? prizeGroup.startTime.valueOf()
      : null;
    this.endTime = prizeGroup.endTime ? prizeGroup.endTime.valueOf() : null;
    this.createdAt = prizeGroup.createdAt.valueOf();
    // creatorName 不在实体中，会在服务层手动设置
  }

  /** 活动ID，业务自定义的唯一标识符 */
  id: string;

  /** 活动名称 */
  name: string;

  /** 活动状态（数字值），与数据库存储的状态一致 */
  status: number;

  /** 活动状态文本，根据状态值翻译后的显示文本 */
  statusText: string;

  /** 开始时间戳（毫秒），无值时为null */
  startTime: number | null;

  /** 结束时间戳（毫秒），无值时为null */
  endTime: number | null;

  /** 创建时间戳，毫秒级时间戳便于前端处理 */
  createdAt: number;

  /** 创建人姓名，实体中不存在该字段，服务层会手动设置 */
  creatorName: string;
}

/**
 * 抽奖活动详情传输对象
 * 用于服务端向前端返回活动的完整详细信息
 */
export class PrizeGroupInfoDto {
  constructor(prizeGroup: BblPrizeGroup) {
    this.id = prizeGroup.id;
    this.name = prizeGroup.name;
    this.description = prizeGroup.description;
    this.status = prizeGroup.status;
    this.statusText = getPrizeGroupStatusText(prizeGroup.status);
    this.startTime = prizeGroup.startTime
      ? prizeGroup.startTime.valueOf()
      : null;
    this.endTime = prizeGroup.endTime ? prizeGroup.endTime.valueOf() : null;
    this.createdAt = prizeGroup.createdAt.valueOf();
    this.updatedAt = prizeGroup.updatedAt ? prizeGroup.updatedAt.valueOf() : 0;
    this.creatorId = prizeGroup.creatorId; // 对应数据库中的CREATED_BY字段
    this.updaterId = prizeGroup.updaterId; // 对应数据库中的UPDATED_BY字段
    // creatorName 和 updaterName 不在实体中，会在服务层手动设置
  }

  /** 活动ID */
  id: string;

  /** 活动名称 */
  name: string;

  /** 活动描述 */
  description: string;

  /** 活动状态（数字值） */
  status: number;

  /** 活动状态文本 */
  statusText: string;

  /** 开始时间戳（毫秒），无值时为null */
  startTime: number | null;

  /** 结束时间戳（毫秒），无值时为null */
  endTime: number | null;

  /** 创建时间戳（毫秒） */
  createdAt: number;

  /** 更新时间戳（毫秒），未更新时为0 */
  updatedAt: number;

  /** 创建人ID，对应数据库中的CREATED_BY字段 */
  creatorId: string;

  /** 创建人姓名，实体中不存在该字段，服务层会手动设置 */
  creatorName: string;

  /** 更新人ID，对应数据库中的UPDATED_BY字段 */
  updaterId: string;

  /** 更新人姓名，实体中不存在该字段，服务层会手动设置 */
  updaterName: string;
}

/**
 * 获取活动状态列表（label-value格式）
 * @returns 包含所有活动状态的数组，每个元素包含label和value字段
 */
export function getPrizeGroupStatusOptions() {
  return Object.entries(PRIZE_GROUP_STATUS_MAP).map(([value, label]) => ({
    value: Number(value),
    label
  }));
}

/**
 * 活动更新传输对象
 * 用于前端向服务端传递更新活动的必要信息
 */
export class PrizeGroupUpdateDto {
  /** 活动ID，需要更新的活动唯一标识符 */
  id: string;

  /** 活动名称，可选更新字段 */
  name?: string;

  /** 活动描述，可选更新字段 */
  description?: string;

  /** 活动状态，可选更新字段 */
  status?: number;

  /** 开始时间，可选更新字段，前端传递13位时间戳 */
  startTime?: number;

  /** 结束时间，可选更新字段，前端传递13位时间戳 */
  endTime?: number;
}
